from tkinter import Button, Label, messagebox
import random
import sys
import settings


class Cell:
    """Класс ячейка-кнопка"""
    all = []
    cell_count = settings.CELL_COUNT
    cell_count_label_object = None

    def __init__(self, x, y, is_mine=False):
        self.is_mine = is_mine
        self.is_opened = False
        self.is_mine_candidate = False
        self.cell_btn_object = None
        self.x = x
        self.y = y
        # добавить объект в Cell.all список
        Cell.all.append(self)

    def create_btn_object(self, location):
        """метод создает объект ячейки-кнопки"""
        btn = Button(location,
                     width=12,
                     height=4,
                     bg='white'
                     #  text=f'{self.x},{self.y}'
                     )
        # вешаем событие на клик мышкой
        btn.bind('<Button-1>', self.left_click_actions)  # левый клик
        btn.bind('<Button-3>', self.right_click_actions)  # правый клик
        self.cell_btn_object = btn

    @staticmethod
    def create_cell_object_label(location):
        lbl = Label(
            location,
            bg='black',
            fg='white',
            text=f"Осталось: {Cell.cell_count}",
            width=12,
            height=4,
            font=("", 25)
        )
        Cell.cell_count_label_object = lbl

    def left_click_actions(self, event):
        """метод для действия левой кнопки мыши"""
        if self.is_mine:
            self.show_mine()
        else:
            # открыть все ячейки рядом если вблизи нет мин
            if self.surrounded_cells_mines_length == 0:
                for i in self.surrounded_cells:
                    i.show_cell()
            self.show_cell()
            # если счетчик мин = колличеству мин - игрок выиграл
            if self.cell_count == settings.MINES_COUNT:
                messagebox.showinfo('Победа', message='Ты выиграл!')

        # отменить действия правой и левой кнопки мыши
        # если ячейка уже открыта
        self.cell_btn_object.unbind('<Button-1>')
        self.cell_btn_object.unbind('<Button-3>')

    def get_cell_by_axis(self, x, y):
        """возвращает объект ячейки на основе значения x и y"""
        for cell in Cell.all:
            if cell.x == x and cell.y == y:
                return cell

    @property
    def surrounded_cells(self):
        """окружающие ячейки относительно кликнутой ячейки"""
        cells = [
            self.get_cell_by_axis(self.x - 1, self.y - 1),
            self.get_cell_by_axis(self.x - 1, self.y),
            self.get_cell_by_axis(self.x - 1, self.y + 1),
            self.get_cell_by_axis(self.x, self.y - 1),
            self.get_cell_by_axis(self.x + 1, self.y - 1),
            self.get_cell_by_axis(self.x + 1, self.y),
            self.get_cell_by_axis(self.x + 1, self.y + 1),
            self.get_cell_by_axis(self.x, self.y + 1),
        ]
        cells = [i for i in cells if i is not None]
        return cells

    @property
    def surrounded_cells_mines_length(self):
        """метод-свойство показывающее колличество мин рядом с открытой"""
        counter = 0
        for cell in self.surrounded_cells:
            if cell.is_mine:
                counter += 1
        return counter

    def show_cell(self):
        """метод показывает количество мин рядом в открытой ячейке"""
        if not self.is_opened:
            Cell.cell_count -= 1
            self.cell_btn_object.configure(
                text=self.surrounded_cells_mines_length)
            # именяем текст на счетчике
            if Cell.cell_count_label_object:
                Cell.cell_count_label_object.configure(
                    text=f'Осталось: {Cell.cell_count}'
                )

            # если ячейка была кандидатом на мину (желтая)
            # и оказалась без мины, мы должны вернуть её белый цвет
            self.cell_btn_object.configure(bg='white')

            # отмечаем ячейку как открытую
            self.is_opened = True

    def show_mine(self):
        """логика приостановки игры и показ сообщения игроку о проигрыше"""
        self.cell_btn_object.configure(bg='red')
        window = messagebox.askokcancel(title="Конец", message='Играть снова?')
        if window:
            pass
        else:
            sys.exit()

    def right_click_actions(self, event):
        """метод для действия левой кнопки мыши"""
        if not self.is_mine_candidate:
            self.cell_btn_object.configure(bg='orange')
            self.is_mine_candidate = True
        else:
            self.cell_btn_object.configure(bg='white')
            self.is_mine_candidate = False

    @classmethod
    def randomize_mines(cls):
        """метод класса который рандомно устанавливает параметр is_mine
        в True некоторым экземпляпрам из списка all (добовляет мины)"""
        picked_cells = random.sample(Cell.all, settings.MINES_COUNT)
        for i in picked_cells:
            i.is_mine = True

    def __repr__(self):
        return f'Cell ({self.x},{self.y})'
